package test0302;

import java.util.HashSet;
import java.util.Scanner;

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 *  * 编写函数, 实现集合的并、交、差和补运算
 *  * 输入: 集合 A 和 B， 集合 A 和 B 中的元素均为自然数
 *  * 输出: 集合 A 和 B 的并、交、差和补集合
 */
@SuppressWarnings({"all"})
public class Main04 {

    public static void main(String[] args) {
        try (Scanner scanner = new Scanner(System.in)) {
            String universalSet = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15";
            System.out.println("假定全集是U = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}");
            System.out.println("请输入集合A, 元素以空格分隔: ");
            String inputA = scanner.nextLine();
            System.out.println("请输入集合B, 元素以空格分隔: ");
            String inputB = scanner.nextLine();
            String unionSet = getUnionSet(inputA, inputB);
            System.out.println("并集为: " + unionSet);
            String intersection = getIntersection(inputA, inputB);
            System.out.println("交集为: " + intersection);
            String differenceSet = getDifferenceSet(inputA, inputB);
            System.out.println("差集为: " + differenceSet);
            String complementarySet = getComplementarySet(inputA, inputB, universalSet);
            System.out.println("补集为: " + complementarySet);
        }
    }

    // 求补集
    private static String getComplementarySet(String inputA, String inputB, String universalSet) {
        StringBuilder ret = new StringBuilder();
        ret.append("[");
        boolean flag = true;
        for (String s : universalSet.split(" ")) {
            if (!inputA.contains(s) && !inputB.contains(s)){
                if (flag){
                    ret.append(s);
                    flag = false;
                }else {
                    ret.append(", " + s);
                }
            }
        }
        ret.append("]");
        return ret.toString();
    }

    // 求差集
    private static String getDifferenceSet(String inputA, String inputB) {
        StringBuilder ret = new StringBuilder();
        ret.append("[");
        String[] stringA = inputA.split(" ");
        boolean flag = true;
        for (String itemA : stringA) {
            if (!inputB.contains(itemA)){
                if (flag){
                    ret.append(itemA);
                    flag = false;
                }else {
                    ret.append(", " + itemA);
                }
            }
        }
        ret.append("]");
        return ret.toString();
    }

    // 求并集
    private static String getUnionSet(String inputA, String inputB) {
        // 使用 Set 来解决 只需要将 A 和 B 集合的元素依次加入 Set 集合 并去重
        HashSet<Integer> set = new HashSet<>();
        for(String s : inputA.split(" ")){
            set.add(Integer.valueOf(s));
        }
        for(String s : inputB.split(" ")){
            set.add(Integer.valueOf(s));
        }
        StringBuilder ret = new StringBuilder();
        ret.append("[");
        boolean flag = true;
        for (Integer item : set) {
            if (flag){
                ret.append(item);
                flag = false;
            }else {
                ret.append(", " + item);
            }
        }
        ret.append("]");
        return ret.toString();
    }

    // 求交集
    private static String getIntersection(String inputA, String inputB) {
        // 以集合A的每个元素为关键码，检索B中是否包含这个元素
        String[] inputStringA = inputA.split(" ");
        StringBuilder ret = new StringBuilder(); // 返回的交集
        ret.append("[");
        boolean flag = true; // 标记是否为第一个，用于控制结果格式
        for (String itemA : inputStringA) {
            if (inputB.contains(itemA)){
                // 如果包含，则加入结果集合
                if (flag){
                    ret.append(itemA);
                    flag = false;
                }else {
                    ret.append(", " + itemA);
                }
            }
        }
        ret.append("]");
        return ret.toString();
    }
}
